# 多进程
import sys
import time
import multiprocessing


# 注意事项：
""""
1、使用多进程时通信时，使用start方法启动子进程
2、子进程需要使用join方法，表示阻塞主进程执行，直到所有子进程执行完成
3、多进程的数据通信，使用queue 队列
- queue.put(数据) ： 写入数据
- queue.get() : 读取数据，没有参数
- 此外，需要注意：每次写入1个数据，只能读取1次，如果写入1次，读取2次，会导致第2次读取一直阻塞，直到有新的数据写入

"""


class Staff(object):
    """
    员工类
    """
    def __init__(self, staff_id) -> None:
        self.staffID = staff_id

    def starr_entry(self):
        """
        多进程demo
        """
        # 定义一个jobNo队列，负责传递工号数据，作为进程间的通信方式
        jobNoQueue = multiprocessing.Queue()
        # 定义一个email队列，负责传递邮箱信息
        emailQueue = multiprocessing.Queue()

        # 1、启动多个进程，执行不同的任务，比如：用户入职行为，具体可以分为：创建账号、创建钉钉账号、开通邮箱、开通OA账号
        processList = [
            # 进程1：创建账号
            multiprocessing.Process(target=self.create_staff, args=(self.staffID, jobNoQueue, )),
            # 进程2：创建钉钉账号
            multiprocessing.Process(target=self.create_dingding, args=(self.staffID, jobNoQueue, )),
            # 进程3：开通邮箱
            multiprocessing.Process(target=self.create_email, args=(self.staffID, emailQueue, )),
            # 进程4：创建OA账号
            multiprocessing.Process(target=self.create_OA, args=(self.staffID, emailQueue, ))
        ]

        # 启动进程，执行各自具体任务
        for process in processList:
            process.start()

        # 使用jon操作，主进程将阻塞执行，直到所有的子进程完成
        for process in processList:
            process.join()

        # 任务结束，打印结束信息
        print("主进程结束：账号开通成功")
        sys.exit()

    def create_staff(self, staffID, queue):
        """
        创建员工表信息
        """
        print(f"开始创建员工表，staff_id = {staffID}")
        time.sleep(2)
        # 获取到员工工号，比如为：003487
        jobNo = "003487"
        queue.put(jobNo)
        print(f"员工表创建成功, 工号是：{jobNo}")

    def create_dingding(self, staffID, queue):
        """
        创建钉钉账号
        """
        print(f"开始创建钉钉账号，staff_id = {staffID}")
        time.sleep(3)
        jobNo = queue.get()
        print(f"钉钉账号创建成功, 工号是：{jobNo}")

    def create_email(self, staffID, queue):
        """
        开通邮箱
        """
        print(f"开始开通企业邮箱，staff_id = {staffID}")
        time.sleep(4)

        # 将工号写入队列
        email = "test@baidu.com"
        queue.put(email)
        print(f"企业邮箱创建成功, 邮箱是：{email}")

    def create_OA(self, staffID, queue):
        """
        开通OA账号
        """
        print(f"开始创建OA账号，staff_id = {staffID}")
        time.sleep(5)
        email = queue.get()
        print(f"OA账号创建成功, OA账号是：{email}")


# 主函数入口
if __name__ == "__main__":
    """
    主函数入口
    """
    staff = Staff(100)
    # 员工入职操作，通过多进程，同时开通多个账号等
    staff.starr_entry()
